TFG

Indice

Introducción

Metodología

Para la realización de este trabajo voy a seguir la metodología estandar CRISP-DM.

Cross Industry Standard Process for Data Mining (CRISP-DM) es un proceso iterativo de creación de software, centrado en el análisis de datos, dividido en 6 fases:

Business Understanding

En esta fase se intenta clarificar el problema a resolver al igual que los objetivos y limitaciones de nuestra solución.

Data Understanding

En esta fase tenemos que obtener nuestros datos, explorarlos y verificar su calidad.

Data Preparation

En esta fase limpiaremos y formatearemos los datos para maximizar su potencial.

Modeling

En esta fase estudiaremos diferentes formas de realizar los modelos de recomendación y diseñare el modelo.

Evaluation

En esta fase estudiaremos el funcionamiento del modelo

Deployment

En esta fase se detallan los pasos de implementación del sistema en un ambiente profesional y las posibles mejoras.

Drawing

Phase 1 of the CRISP-DM Process Model: Business Understanding

El objetivo de este Trabajo de Fin de Grado es realizar un sistema de recomendación de películas basado en contenidos (Content-based recommender system), con verificación de recomendaciones basadas en las visualizaciones de otros usuarios.

Este trabajo no tiene un fin comercial. De todos modos, su objetivo comercial sería estudiar las técnicas de sistemas de recomendación y proporcionar una solucíon propia a este problema.

La restricción principal de este trabajo es el tiempo.

Debe ser presentado cualquiera de las siguientes tres convocatorias, Febrero, Junio o Septiembre.

El impacto de este trabajo será a nivel académico y de demostración de las tecnologías actuales de ML y de sistemas de codificación del lenguaje natural.

Phase 2 of the CRISP-DM Process Model: Data Understanding

2.1 Gathering data

La pagina web de metacritic es un sitio web que recopila reseñas de álbumes de música, videojuegos, películas, programas de televisión y libros.

Para cada categoría de entretenimiento (musica, videojuegos, libros ...), Metacritic dispone de un top donde se encuentran todos los elementos organizados por nota.

En concreto, me voy a centrar en el top de películas (https://www.metacritic.com/browse/movies/score/metascore/all/filtered?page=0).

Este top está dispuesto (actualmente) en 145 páginas, cada uno con entradas correspondientes a 100 películas.

El conjunto de datos ha sido recogido por mi utilizando un programa de webscrapping realizado en python.

En concreto el programa de webscrapping sigue el siguiente esquema:

DiccionarioPeliculas=[]

Para cada numero x de 1 a 145:

    pagina= descargarHTMLPagina(x);

    Para cada numero y de 1 a 100:

        pelicula = descargarHTMLPelicula(y)

        datosPelicula=procesarPelicula(pelicula)

        DiccionarioPeliculas.añadir(datosPelicula)

Para completar nuestra base de datos, nos interesaría mucho disponer de las reviews específicas de los usuarios para cada película que hemos recogido previamente.

Por lo tanto, usando otro programa de webscrapping realizaríamos la siguiente tarea:

PeliculasDeseadas = DiccionarioPeliculas

DiccionarioReviews=[]

Para cada pelicula en DiccionarioPeliculas:

    HTML = descargarHTMLPelicula(pelicula)

    RCs = procesarReviewsCriticos(HTML)

    RUs = procesarReviewsUsers(HTML)

    DiccionarioReviews.añadir(RCs)

    DiccionarioReviews.añadir(RUs)



PENDIENTE: #EXPLICAR EN MAYOR DETALLE EL SCRAPPER

2.2 Describing the data

Primero importaré las librerías necesarias y los datasets de películas y reviews que hemos recopilado en el apartado anterior.

Habiendo importado los datasets a un dataframe de la librería pandas correctamente, usaré el info para mostrar el número de entradas y los atributos de cada dataset.

Como podemos ver, disponemos de 13255 entradas con 12 columnas.

Solo 4 de estas columnas son variables discretas, rating, year of release, runtime y rank.

   Rating contiene la nota de 0 a 10 impuesta por los usuarios.

   Rank contiene la posición 1-15000 en la que esta película (impuesto por metacritic)

   Year contiene el año de salida de la película.

   Runtime contiene la duración de la película.


Es esperable que los atributos rating y rank esten fuertemente correlados ya que expresan información muy parecida. Esta afirmación la comprobaré mas tarde, ya que si el valor de correlación es muy alto podríamos considerar un solo atributo.

Por otro lado las variables categóricas son las siguientes:

    Title: contiene el titulo de la película.

    age_rating: indica la edad mínima recomendada para la visualización. Posteriormente haré un análisis para representarla como un entero.

    genre: indica el género.

    director: nombre del director principal de la película.

    producer: nombre de la productora.

    actor: nombre del actor principal de la película.

    description: parrafo con la descripción de la película.

    img: url de la carátula de la película.

    url: url de la página de metacritic donde se describe la película.


Por otro lado, la composición de nuestro dataset de reviews es la siguiente:

Como podemos ver tiene 5 atributos.

Title: string que contiene el nombre de la película que se está puntuando.

User: string que contiene el nombre de usuario del autor de la review.

Type: variable que identifica si el autor es un "reviewer profesional" o un usuario de la web.

Grade: nota de la review.

Review: string que contiene la valoración de la película.

2.3 Exploring data

Como podemos observar, nuestro dataset está compuesto por películas dispuestas en 22 géneros.

El drama es el género más común por grán mayoría. Seguido por acción Acción, documentales y biografías.

Como no vamos a realizar una predicción de genéneros de películas, en principio, este desbalanceo no presentará un problema en el futuro.

Por otra parte, ratings de edad de las películas se disponen de la siguiente forma:

Los años de salida siguen la siguiente distribución

Como podemos observar, desde el año 2000 a habido un crecimiento lineal en la producción de películas, a excepción de 2 parones en los siguientes años:

Para mostrar el tiempo de ejecución voy a usar un diagrama de "caja y bigotes" o boxplot.

El resultado es el siguiente:

Como podemos observar, la mediana en cuanto a duración es 101 minutos.

Los valores extremos se situan en 62 y 144 minutos. Las duraciones fuera de este rango se consideran datos atípicos o outliers.

También vamos a visualizar los 25 actores principales más comunes.

Con respecto a las notas de las reviews, voy a realizar un boxplot para representar las notas de los usuarios y los reviewers.

Como podemos observar, las notas de los reviewers se encuentran en el rango de 0 a 100 y las de los usuarios, de 0 a 10.

Por lo tanto, esto lo tendremos que tener en cuenta en el apartado de data preparation.

También nos interesaría mucho saber si las reviews están en inglés.

Sabemos que las reviews de los usuarios no están filtradas. Por lo tanto para identificar si el idioma de la review es inglés, usaré la libreria Natural Language Toolkit (NLTK).

Primero definiré un conjunto con todas las palabras del idioma inglés que contiene la librería NLTK.

Luego realizaré la intersección de conjuntos de forma que obtendríamos las palabras en inglés de la review.

Por último, usando la longitud original de la review, y la de la intersección, calcularemos el porcentaje de la review que está escrita en inglés.

Como podemos ver, el porcentaje de palabras en inglés sigue una distribución gausiana, centrada en el 75%.

Podríamos considerar que las reviews que tienen un contenido de palabras en inlés menor al 50% no están en inglés.

2.4 Verifying data quality

Para verificar la calidad de nuestros conjuntos de datos verificaré los siguientes criterios:

2.4.1 Unicidad:

Para comprobar la unicidad de nuestros conjuntos de datos podemos utilizar el siguiente método de la librería pandas

Pandas.DataFrame.duplicated() 

Este método, dado un dataframe, devuelve, para cada una de las entradas, si es única o no.

Agrupando este resultado con la función value_counts() obtenemos el siguiente resultado.

Como podemos observar, existen 423 reviews duplicadas y 0 películas duplicadas.

Por lo tanto, podemos ejecutar la función drop_duplicates() de los dataframes de la librería pandas y eliminar estos valores repetidos.

Si comprobasemos ahora los resultados de la función anterior obtendriamos 0 repetidos.

2.4.2 Completitud:

Considero que tanto el dataset de reviews como el de películas son muy completos en cuanto a contenido y numero de entradas.

Ambos datasets contienen todas las entradas en cuanto a películas o críticas disponibles en metacritic.

No existe ninguna dataset publica de Metacritic para la sección de películas. Por lo tanto compararé mi dataset con los 3 datasets de reviews de películas mas "relevantes" según el buscador de Kaggle:

2.4.3 Validez:

El conjunto de datos de Películas es válido ya que ha sido creado por empleados de metacritic y solo contiene datos factuales.

Por otro lado, algunas atributos son nulos o están por determinar si la película no ha salido todavía al público.

El conjunto de datos de reviews si que puede presentar problemas de validez debido a que las reviews de los usuarios no son filtradas.

2.4.4 Consistencia:

Durante el estudio exploratorio del conjunto de datos he encontrado las siguientes inconsistencias:

Las clasificaciones de edad de cada película usan las convenciones particulares de cuando esa película fue grabada.

Por lo tanto, disponemos de 24 labels categóricas que podrían ser remplazadas por unos pocos números enteros.

Las reviews de los criticos estan sobre 100 en metacritic y las de los users sobre 10.

Algunas reviews incluyen la string "This review contains spoilers, click expand to view." indicando que esa review tiene spoilers. Este patrón será eliminado del contenido de la review y indicado en una nueva columna de nuestro dataset.

Como hemos visto en el análisis exploratorio, las reviews son mayoritariamente en inglés. De todos modos, existen algunas reviews que su contenido de palabras en inglés es muy bajo, por lo tanto, están en otro idioma (o repletas de faltas de ortografía).

2.4.5 Precisión:

El dataset de películas es preciso ya que ha sido realizado por profesionales encargados de gestionar la página de metacritic.

El dataset de reviews tiene un contendio subjetivo, por lo tanto no podemos medir su precisión. De todos modos cabe destacar que las reviews esta categorizadas por si son de Reviewers o de Usuarios.

Phase 3 of the CRISP-DM Process Model: Data Preparation

3.1 Cleaning the data

3.1.1 Procesado de la clasificación de edad.

Como hemos podido observar en el gráfico anterior, esta columna está muy desbalanceada, a demas tiene un alto contenido de valores nulos. De todos modos, vamos a realizar data wrangling de forma que agrupamos estas variables categóricas en edades como numeros enteros.

Como podemos observar, hemos eliminado las variables categóricas y el resultado es mucho mas claro.

Seguimos teniendo una gran cantidad de valores sin calificar (valor -1 en el eje x), sin embargo, como la gran mayoría de valores se encuentran entre 13 y 18 creo que sería buena idea sustituirlo por el valor medio.

Esta distribución sería más apropiada teniendo en cuenta los datos no nulos.

3.1.2 Re-escalado de notas de usuarios

Como hemos visto en el apartado 2.3 Exploring data, las calificaciones realizadas por los usuarios se encuentran en el rango de 0 a 10 y las de los críticos en el rango de 0 a 100.

Por lo tanto, vamos a multiplicar las calificaciones de los usuarios por 10 para que todas las calificaciones se encuentren en el mismo intervalo.

Tras aplicar una función lambda, podemos comprobar el resultado con el mismo boxplot que antes.

3.1.3 Limpieza de contenido de reviews con spoilers.

Muchas de las reviews de nuestro dataset contienen spoilers.

Metacritic incluye la siguiente subcadena en las reviews con spoilers.

"This review contains spoilers, click expand to view."

Eliminaremos esta subcadena de nuestras reviews para eliminar un posible efecto negativo en el algoritmo de vectorización.

De todos modos, añadiremos una nueva columna a nuestro dataset que indique si la review contiene spoilers o no.

Para comprobar si el filtrado ha funcionado correctamente volveremos a ejecutar el método contains agrupado por la función value_counts()

3.1.4 Indicación de idioma inglés en las reviews.

Para identificar si el idioma de la review es inglés, hemos usado la libreria Natural Language Toolkit (NLTK).

En el análisis exploratorio de datos he creado una lista (englishCounter) que indica el porcentaje de la review que está en inglés.

Esta lista va a ser anexionada como una nueva columna al dataset, para cuando hagamos el modelo, podamos rechazar las entradas con un bajo contenido de palabras en inglés.

3.2 Constructing the clean dataset.

Tras haber limpiado nuestros datasets podemos exportarlos en nuevos ficheros.

Phase 4 of the CRISP-DM Process Model: Modeling

4.1 Selecting modeling techniques

PENDIENTE: Explicar las diferentes tecnicas de vectorizado y por que considero que son una buena idea para un sistema de recomendación

4.2 Building model(s)

PENDIENTE: Programar el modelo

Phase 5 of the CRISP-DM Process Model: Evaluation

PENDIENTE: Estudiar posibilidades de evaluación y valorar resultados.

Phase 6 of the CRISP-DM Process Model: Deployment

PENDIENTE: ¿pasar de notebook a py y hacer gui?

## BIBLIOGRAFIA

CRISP DM Pete Chapman, Julian Clinton, Randy Kerber, Thomas Khabaza, Thomas Reinartz, Colin Shearer, and Rüdiger Wirth (2000); The CRISP-DM User Guide https://www.the-modeling-agency.com/crisp-dm.pdf

Citar los 3 datasets

Metacritic top

Beautiful soup documentation

La web donde explican lo de STEM,TOR, proxy... </font>